<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>1_高阶函数-函数柯里化</title>
</head>
<body>
    <!-- 准备好一个“容器” -->
    <div id="test"></div>
    <!-- 引入react核心库 -->
    <script type="text/javascript" src="../js/react.development.js"></script>
    <!-- 引入react-dom 用于支持react操作DOM -->
    <script type="text/javascript" src="../js/react-dom.development.js"></script>
    <!-- 引入babel 用于将jsx转换为js -->
    <script type="text/javascript" src="../js/babel.min.js"></script>

    <script type="text/babel">  // 此处一定要写babel
    // #region
         /*
           高阶函数：如果一个函数符合下面2个规范中的任何一个，那该函数就是高阶函数。
                   1. 若A函数，接收的参数是一个函数，那么A就可以称之为高阶函数。
                   2. 若A函数，调用的返回值依然是一个函数，那么A就可以称之为高阶函数。
                   常见的高阶函数有：Promise、setTimeout、arr.map()等等
            
           函数的柯里化：通过函数调用继续返回函数的方式，实现多次接收参数最后统一处理的函数编码形式。
         */
    // #endregion

    // 1. 创建组件
    class Login extends React.Component {
      // 初始化状态
      state = {
        username: '',
        password: ''
      }

      // 保存表单数据到状态中
      saveFormData = (dataType) => {
        return (event) => {
          this.setState({[dataType]: event.target.value})
        }
      }

      handleSubmit = (event) => {
        event.preventDefault() // 阻止表单提交
        const {username, password} = this.state
        alert(`你输入的用户名是：${username}, 你输入的密码是：${password}`)
      }

       render(){
        return(
          <form onSubmit={this.handleSubmit}>
               用户名： <input onChange={this.saveFormData('username')} type="text" name="username" />
               密码：<input onChange={this.saveFormData('password')} type="password" name="password" />
               <button>登录</button>
           </form>
        )
       }
    }
    // 2. 渲染虚拟组件到页面
    ReactDOM.render(<Login a="1" b="2" />, document.getElementById('test'))

    </script>
</body>
</html>